#pragma once

#include "Protocol.hpp"
#include "Logger.hpp"
#include <string>
#include <iostream>
#include <functional>

using handler_t = std::function<Response(Requst &req)>;

//该类主要是用来对报文进行解析
class Parser
{
public:
    Parser(handler_t handler)
        :_handler(handler)
    {

    }
    std::string Parse(std::string &inbuffer)
    {
        std::string send_str;
        while(true)
        {
            //1. 解析报文(解包)
            std::string json_str;
            int n = Protocol::Unpack(inbuffer, &json_str);
            if(n < 0)
                exit(0);
            else if(n == 0)
            {
                //说明已经解析完所有报文
                break;
            }
            else if(n > 0)
            {
                //2. 反序列化
                Requst req;
                if(!req.Deserialize(json_str))
                {
                    return std::string();
                }
                //3. 根据反序列化得到的数据将数据回调给上层做对应的工作
                Response resp = _handler(req);
                //4. 序列化
                std::string resp_json;
                if(!resp.Serialize(&resp_json))
                {
                    return std::string();
                }
                //5. 打包
                send_str += Protocol::Package(resp_json);
            }
        }
        return send_str;
    }
    ~Parser()
    {

    }
public:
    //回调函数
    handler_t _handler;
};